﻿using System;
using System.Globalization;
using System.Windows.Forms;

namespace CreateMapping
{
    public partial class FrmCreateMappingFile : Form
    {
        private static readonly String[] EndSentenceSignals = new string[]
                                                          {
                                                              ". ", ".\n", "? ", "?\n",
                                                              "! ", "!\n", "\n"
                                                          };

        private static readonly String[] EndSentenceSignalsException = new String[]
                                                                   {
                                                                       "@",
                                                                       "."
                                                                   };

        Sentence FindSentence(int cursorPosition, String documentText) {
            //
            if (cursorPosition >= documentText.Length) {
                return null;
            }
            // before cursor
            String before = documentText.Substring(0, cursorPosition);

            // tìm indexOfStart
            int indexOfStart = 0;
            for (int i = 0; i < EndSentenceSignals.Length; i++) {
                int canStart = before.LastIndexOf(EndSentenceSignals[i].ToString(CultureInfo.InvariantCulture), System.StringComparison.Ordinal);
                // kiểm tra ký tự liền sau vị trí vừa tìm được
                if (canStart < documentText.Length - 1) {
                    for (int j = 0; j < EndSentenceSignalsException.Length; j++) {
                        if (EndSentenceSignalsException[j].Equals(documentText[canStart + 1].ToString(CultureInfo.InvariantCulture))) {
                            continue;
                        }
                    }
                }
                // tìm ký tự kết thúc gần cursorPosition nhất
                if (canStart > indexOfStart) {
                    indexOfStart = canStart;
                }
            }
            // Loại bỏ ký tự kết thúc câu của câu trước
            if (indexOfStart > 0) {
                indexOfStart++;
            }
            // tìm indexOfEnd
            int indexOfEnd = documentText.Length - 1;
            for (int i = 0; i < EndSentenceSignals.Length; i++) {
                int canEnd = documentText.IndexOf(EndSentenceSignals[i], cursorPosition, System.StringComparison.Ordinal);

                // kiểm tra ký tự liền sau vị trí vừa tìm được
                if (canEnd < documentText.Length - 1) {
                    for (int j = 0; j < EndSentenceSignalsException.Length; j++) {
                        if (EndSentenceSignalsException[j].Equals(documentText[canEnd + 1].ToString(CultureInfo.InvariantCulture))) {
                            continue;
                        }
                    }
                }

                // kiểm tra đây có phải là câu cuối cùng không có dấu kết thúc hay
                // không
                if (canEnd == -1) {
                    canEnd = documentText.Length - 1;
                }
                // tìm ký tự kết thúc gần cursorPosition nhất
                if (canEnd < indexOfEnd) {
                    indexOfEnd = canEnd;
                }
            }
            if (indexOfEnd <= indexOfStart) {
                return null;
            }
            /*
             * if (documentText.charAt(indexOfStart) == ' ') { indexOfStart++; } for
             * (int i = 0; i < endSentenceSignals.length; i++) { if
             * (endSentenceSignals
             * [i].equals(Character.toString(documentText.charAt(indexOfEnd)))) {
             * indexOfEnd--; break; } }
             */
            Sentence sentence = new Sentence(indexOfStart, indexOfEnd, SentenceOrderV2(documentText, cursorPosition));
            return sentence;
        }

        public static int SentenceOrderV2(String documentText, int cursorPosition) {
            int order = 0;
            int cursor = 1;
            while (cursor < cursorPosition) {
                // tìm indexOfEnd
                int indexOfEnd = documentText.Length - 1;
                for (int i = 0; i < EndSentenceSignals.Length; i++) {
                    int canEnd = documentText.IndexOf(EndSentenceSignals[i], cursor, System.StringComparison.Ordinal);
                    // kiểm tra ký tự liền sau vị trí vừa tìm được
                    if (canEnd < documentText.Length - 1) {
                        for (int j = 0; j < EndSentenceSignalsException.Length; j++) {
                            if (EndSentenceSignalsException[j].Equals(documentText[canEnd + 1].ToString(CultureInfo.InvariantCulture))) {
                                cursor++;
                                continue;
                            }
                        }
                    }

                    // kiểm tra đây có phải là câu cuối cùng không có dấu kết thúc
                    // hay không
                    if (canEnd == -1) {
                        canEnd = documentText.Length - 1;
                    }
                    // tìm ký tự kết thúc gần cursorPosition nhất
                    if (canEnd < indexOfEnd) {
                        indexOfEnd = canEnd;
                    }
                }
                if (indexOfEnd > 0) {
                    if (documentText[indexOfEnd - 1] == '\n'
                            && documentText[indexOfEnd] == '\n') {
                        cursor++;
                        continue;
                    }
                }
                if (indexOfEnd < documentText.Length - 2) {
                    if (documentText[indexOfEnd + 1] == '\n'
                            && documentText[indexOfEnd] == '\n') {
                        cursor++;
                        continue;
                    }
                }
                order++;
                cursor = indexOfEnd + 1;
            }
            return order;
        }

        private void groupBox1_Enter(object sender, EventArgs e) {

        }
    }
}
